package leetcode.Hot100;

/**
 * @author Cheng Jun
 * Description: 给你一个字符串 s ，请你统计并返回这个字符串中 回文子串 的数目。
 * 输入：s = "aaa"
 * 输出：6
 * 解释：6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
 * https://leetcode-cn.com/problems/palindromic-substrings/
 * @version 1.0
 * @date 2021/11/13 21:34
 * @see longestPalindrome
 */
public class countSubstrings {

    public static void main(String[] args) {

        System.out.println(countSubstrings("abcdd"));
    }

    // 穷举的暴力解法 时间复杂度 O(n^3)
    // 采用中心 扩散法 时间复杂度 O(n^2)
    static int countSubstrings(String s) {
        int count = s.length();

        for (int i = 0; i < s.toCharArray().length; i++) {
            // 偶数回文串标识符
            boolean even = true;
            int evenLeft = i;
            int evenRight = i + 1;
            // 偶数回文串为真，继续扩散，直到为假或越界，每一次为真 count++
            while (even && evenLeft >= 0 && evenRight < s.length()) {
                if (s.charAt(evenLeft) == s.charAt(evenRight)) {
                    evenLeft--;
                    evenRight++;
                    count++;
                } else {
                    even = false;
                }
            }
            // 奇数回文串标识符
            boolean odd = true;
            int oddLeft = i - 1;
            int oddRight = i + 1;
            // 奇数回文串为真，继续扩散，直到为假或越界，每一次为真 count++
            while (odd && oddLeft >= 0 && oddRight < s.length()) {
                if (s.charAt(oddLeft) == s.charAt(oddRight)) {
                    oddLeft--;
                    oddRight++;
                    count++;
                } else {
                    odd = false;
                }
            }
        }
        return count;
    }

    // static boolean isPalindrome(int left, int right, String s) {
    //
    // }

    // 学一下 Manacher‘s Algorithm
}
